package com.flow.asyncflow.core.entity.codegeneration;


import com.flow.asyncflow.core.enums.ExecuteEnum;
import com.flow.asyncflow.core.enums.NodeTypeEnum;
import lombok.Data;

import java.util.*;

/**
 * 异步流模板生成上下文类
 */
@Data
public class VelocityModel {

    /**
     * 模块名称
     */
    private String asyncFlowModuleName;
    /**
     * 异步流描述
     */
    private String asyncFlowDes;
    /**
     * 异步流责任人名称
     */
    private String asyncFlowMaintainName;
    /**
     * 异步流超时报警时间(毫秒)
     */
    private int asyncFlowTimeOutsLimit;

    /**
     * 异步流管理器名称
     */
    private String asyncFlowManagerFileName;
    /**
     * 异步流管理器文件路径
     */
    private String asyncFlowManagerFilePath;
    /**
     * 异步流管理器包路径
     */
    private String asyncFlowManagerPackagePath;


    /**
     * 异步流请求参数名称
     */
    private String asyncFlowRequestFileName;
    /**
     * 异步流请求参数文件路径
     */
    private String asyncFlowRequestFilePath;
    /**
     * 异步流请求参数包路径
     */
    private String asyncFlowRequestPackagePath;

    /**
     * 、
     * 异步流返回参数名称
     */
    private String asyncFlowResponseFileName;
    /**
     * 异步流返回参数文件路径
     */
    private String asyncFlowResponseFilePath;
    /**
     * 异步流返回参数包路径
     */
    private String asyncFlowResponsePackagePath;

    /**
     * 异步流上下文名称
     */
    private String asyncFlowDataFileName;
    /**
     * 异步流上下文文件路径
     */
    private String asyncFlowDataFilePath;
    /**
     * 异步流上下文包路径
     */
    private String asyncFlowDataPackagePath;
    /**
     * 是否需要继承上下文基类
     */
    private boolean hasBaseContext;
    /**
     * 上下文基类名称
     */
    private String baseContextFileName;
    /**
     * 上下文基类文件路径
     */
    private String baseContextFilePath;
    /**
     * 上下文基类包路径
     */
    private String baseContextPackagePath;

    /**
     * 操作枚举名称
     */
    private String operatorEnumFileName;
    /**
     * 操作枚举文件路径
     */
    private String operatorEnumFilePath;
    /**
     * 操作枚举包路径
     */
    private String operatorEnumPackagePath;

    /**
     * 是否覆盖原来存在Manager
     */
    private boolean replaceManager;

    /**
     * 是否覆盖原来存在OperatorEnum
     */
    private boolean replaceOperatorEnum;
    /**
     * 是否是新的的Manager
     */
    private boolean newManager = true;


    /**
     * 文件创建人
     */
    private String author;

    /**
     * 文件创建时间
     */
    private String date;


    //当期操作的节点
    private AsyncFlowNodeInfo asyncFlowNodeInfo;
    //前端请求的所有节点
    private LinkedList<AsyncFlowNodeInfo> asyncFlowNodeInfoList = new LinkedList<>();

    private AsyncFlowOperatorEnumInfo asyncFlowOperatorEnumInfo;
    private LinkedList<AsyncFlowOperatorEnumInfo> asyncFlowOperatorEnumInfoList = new LinkedList<>();

    @Data
    public static class AsyncFlowNodeInfo {
        //是否是已经生成好了的公共类型操作
        private NodeTypeEnum nodeTypeEnum;
        //异步流节点文件路径
        private String asyncFlowNodeFilePath;
        //异步流节点包路径
        private String asyncFlowNodePackagePath;
        //Validator：验证   GetData：查询    GetDataPub：公共查询  Operator：操作   Save：保存    Sync：保存后同步    Async：保存后异步
        private ExecuteEnum executeEnum;
        //异步流节点文件描述
        private String asyncFlowNodeDes;
        //异步流节点文件名称
        private String asyncFlowNodeFileName;
        //异步流节点是否异步
        private boolean async;

    }


    @Data
    public static class AsyncFlowOperatorEnumInfo {

        /**
         * 枚举名称
         */
        private  Object name;
        /**
         * 枚举code
         */
        private  Object code;
        /**
         * 枚举msg
         */
        private  Object msg;

        //是否是新的枚举值，还是系统原来就存在的
        private boolean newEnumValue;
        /**
         * 是否选中
         */
        private boolean select;

    }
}
